home *** CD-ROM | disk | FTP | other *** search
/ Java Developer's Companion / Java Developer's Companion.iso / Javacup / IN231VFD.TAR / internet / IN231VFD / Slider.java < prev    next >
Text File  |  1996-05-21  |  9KB  |  349 lines

  1. /*
  2.  * @(#)Slider.java    0.90 11/15/95 Adam Doppelt
  3.  */
  4. //package demo.slider;
  5.  
  6. import java.awt.*;
  7.  
  8. /**
  9.  * A Slider is a widget that varies between a minimum and a maximum
  10.  * value. The user can drag a "thumb" to change the current value. As
  11.  * the slider is dragged, Motion() is called. When the slider is
  12.  * released, Release() is called. Override these two methods to give
  13.  * the slider behavior.
  14.  *
  15.  * @version 0.90 15 Nov 1995
  16.  * @author <A HREF="http://www.cs.brown.edu/people/amd/">Adam Doppelt</A> */
  17.  
  18. /* Several enhancements made by Dale Gass:
  19.  *     Better handling of sizing
  20.  *     Slider scale
  21.  *    Constructor which sets values
  22.  *    Default Motion() and Release() now post Events
  23.  */
  24.  
  25. public class Slider extends Canvas {
  26.     private final static int THUMB_SIZE = 14;
  27.     private final static int BUFFER = 2;
  28.  
  29.     private final static int TEXT_HEIGHT = 18;
  30.     private final static int TEXT_BUFFER = 3;
  31.     
  32.     private final static int DEFAULT_WIDTH = 100;
  33.     private final static int DEFAULT_HEIGHT = 15;
  34.  
  35.     private final static int MIN_WIDTH = 2 * (THUMB_SIZE + BUFFER + 1);
  36.     private final static int MIN_HEIGHT = 2 * (BUFFER + 1);
  37.  
  38.     private final static int DEFAULT_MIN = 1;
  39.     private final static int DEFAULT_MAX = 100;    
  40.  
  41.     final static int SLIDER_EVENTS = 12000;
  42.     public final static int SLIDER_MOVE = SLIDER_EVENTS + 1;
  43.     public final static int SLIDER_STOP = SLIDER_EVENTS + 2;
  44.  
  45.     int min_, max_, value_, pixel_;
  46.     int reqx_ = -1, reqy_ = -1;
  47.     double scale_;
  48.     int pixelMin_, pixelMax_;
  49.     Color backgroundColor_, thumbColor_, barColor_, slashColor_, textColor_;
  50.     Font font_;
  51.     
  52. /**
  53.  * Constructs a slider.
  54.  * @param container The container for this slider.
  55.  */
  56.     public Slider () {
  57.     min_ = DEFAULT_MIN;
  58.     max_ = DEFAULT_MAX;
  59.     scale_ = 1.0;
  60.     resize(DEFAULT_WIDTH, DEFAULT_HEIGHT + TEXT_HEIGHT);
  61.     font_ = new Font("TimesRoman", Font.PLAIN, 12);
  62.     backgroundColor_ = Color.lightGray;
  63.     thumbColor_ = Color.lightGray;
  64.     barColor_ = Color.lightGray.darker();
  65.     slashColor_ = Color.black;
  66.     textColor_ = Color.black;
  67.     SetValue(1);
  68.     }
  69.  
  70. /**
  71.  * Constructs a slider.
  72.  * @param 
  73.  */
  74.     public Slider(int w, int h, int m, int x, int v, double s) {
  75.         this();
  76.     SetWidth(w);
  77.     SetHeight(h);
  78.     SetMinimum(m);
  79.     SetMaximum(x);
  80.     SetValue(v);
  81.     SetScale(s);
  82.     }
  83.  
  84. /**
  85.  * This method is called when the "thumb" of the slider is dragged by
  86.  * the user. Must be overridden to give the slider some behavior.
  87.  *   */
  88.     public void Motion () { 
  89.         postEvent(new Event(this, SLIDER_MOVE, new Integer(GetValue())));
  90.     }
  91.  
  92. /**
  93.  * This method is called when the "thumb" of the slider is released
  94.  * after being dragged. Must be overridden to give the slider some
  95.  * behavior.
  96.  *   */
  97.     public void Release () {
  98.         postEvent(new Event(this, SLIDER_STOP, new Integer(GetValue())));
  99.     }
  100.     
  101. /**
  102.  * Sets the maximum value for the slider.
  103.  * @param num The new maximum.
  104.  */
  105.     public void SetMaximum (int num) {
  106.     max_ = num;
  107.     if (max_ < min_) {
  108.         int t = min_;
  109.         min_ = max_;
  110.         max_ = t;
  111.     }
  112.     SetValue(value_);
  113.     }
  114.     
  115. /**
  116.  * Sets the minimum value for the slider.
  117.  * @param num The new minimum.
  118.  */
  119.     public void SetMinimum (int num) {
  120.     min_ = num;
  121.     if (max_ < min_) {
  122.         int t = min_;
  123.         min_ = max_;
  124.         max_ = t;
  125.     }
  126.     SetValue(value_);
  127.     }
  128.  
  129.     public void SetScale (double num) {
  130.         scale_ = num;
  131.     }
  132.     
  133. /**
  134.  * Sets the current value for the slider. The thumb will move to
  135.  * reflect the new setting.
  136.  * @param num The new setting for the slider.
  137.  *   */
  138.     public void SetValue (int num) {
  139.     value_ = num;
  140.     
  141.     if (value_ < min_)
  142.         value_ = min_;
  143.     else if (value_ > max_)
  144.         value_ = max_;
  145.     
  146.     if (value_ != min_)
  147.         pixel_ = (int)(Math.round(Math.abs((double)(value_ - min_) /
  148.                            (double)(max_ - min_)) *
  149.                       (double)(pixelMax_ - pixelMin_)) +
  150.                pixelMin_);
  151.     else
  152.         pixel_ = pixelMin_;
  153.  
  154.     repaint();
  155.     }
  156.     
  157. /**
  158.  * Sets the height of the slider. This is the height of the entire
  159.  * slider canvas, including space reserved for displaying the
  160.  * current value.
  161.  * @param num The new height.
  162.  *   */
  163.     public void SetHeight (int num) {
  164.     if (num < MIN_HEIGHT + TEXT_HEIGHT)
  165.         num = MIN_HEIGHT + TEXT_HEIGHT;
  166.     resize(size().width, reqy_ = num);
  167.     repaint();
  168.     }
  169.     
  170. /**
  171.  * Sets the width of the slider. This is the width of the actual
  172.  * slider box.
  173.  * @param num The new width.
  174.  *   */
  175.     public void SetWidth (int num) {
  176.     if (num < MIN_WIDTH)
  177.         num = MIN_WIDTH;
  178.     resize(reqx_ = num, size().height);
  179.     repaint();    
  180.     }
  181.     
  182. /**
  183.  * Returns the current value for the slider.
  184.  * @return The current value for the slider.
  185.  */
  186.     public int GetValue () {
  187.     return value_;
  188.     }
  189.  
  190. /**
  191.  * Sets the background color for the slider. The "background" is the
  192.  * area outside of the bar.
  193.  * @param color The new background color.
  194.  */
  195.     public void SetBackgroundColor(Color color) {
  196.     backgroundColor_ = color;
  197.     repaint();
  198.     }
  199.  
  200. /**
  201.  * Sets the color for the slider's thumb. The "thumb" is the box that
  202.  * the user can slide back and forth.
  203.  * @param color The new thumb color.
  204.  */
  205.     public void SetThumbColor(Color color) {
  206.     thumbColor_ = color;
  207.     repaint();
  208.     }
  209.  
  210. /**
  211.  * Sets the color for the slider's bar. The "bar" is the rectangle
  212.  * that the thumb slides around in.
  213.  * @param color The new bar color.
  214.  */
  215.     public void SetBarColor (Color color) {
  216.     barColor_ = color;
  217.     repaint();
  218.     }
  219.  
  220. /**
  221.  * Sets the slash color for the slider. The "slash" is the little
  222.  * vertical line on the thumb.
  223.  * @param color The new slash color.
  224.  */
  225.     public void SetSlashColor(Color color) {
  226.     slashColor_ = color;
  227.     repaint();
  228.     }
  229.  
  230. /**
  231.  * Sets the color for the slider`s text.
  232.  * @param color The new text color.
  233.  */
  234.     public void SetTextColor(Color color) {
  235.     textColor_ = color;
  236.     repaint();
  237.     }
  238.  
  239. /**
  240.  * Sets the font for the slider`s text.
  241.  * @param font The new font.
  242.  */
  243.     public void SetFont(Font font) {
  244.     font_ = font;
  245.     repaint();
  246.     }
  247.     
  248. /**
  249.  * An internal method used to handle repaint events.
  250.  */
  251.     public void paint(Graphics g) {
  252.     int width = size().width;    
  253.     int height = size().height;
  254.  
  255.     g.setColor(backgroundColor_);
  256.     g.fillRect(0, 0, width, TEXT_HEIGHT);
  257.  
  258.     g.setColor(barColor_);
  259.     g.fill3DRect(0, TEXT_HEIGHT,
  260.              width, height - TEXT_HEIGHT, false);
  261.  
  262.     g.setColor(thumbColor_);    
  263.     g.fill3DRect(pixel_ - THUMB_SIZE, TEXT_HEIGHT + BUFFER,
  264.              THUMB_SIZE * 2 + 1, height - 2 * BUFFER - TEXT_HEIGHT,
  265.              true);
  266.     
  267.     g.setColor(slashColor_);
  268.     g.drawLine(pixel_, TEXT_HEIGHT + BUFFER + 1,
  269.            pixel_, height - 2 * BUFFER);
  270.  
  271.     g.setColor(textColor_);
  272.     g.setFont(font_);        
  273.     String str = String.valueOf(value_ * scale_);
  274.     g.drawString(str, pixel_ -
  275.              (int)(getFontMetrics(font_).stringWidth(str) / 2),
  276.              TEXT_HEIGHT - TEXT_BUFFER);
  277.     }
  278.  
  279.     void HandleMouse(int x) {
  280.     double percent;
  281.     int width = size().width;
  282.     pixel_ = Math.max(x, pixelMin_);
  283.     pixel_ = Math.min(pixel_, pixelMax_);
  284.  
  285.     if (pixel_ != pixelMin_)
  286.         percent = (((double)pixel_ - pixelMin_) /
  287.                (pixelMax_ - pixelMin_));
  288.     else
  289.         percent = 0;
  290.     
  291.     value_ = (int)(Math.round(percent * (double)(max_ - min_))) + min_;
  292.     
  293.     paint(getGraphics());
  294.     }
  295.     
  296. /**
  297.  * An internal method used to handle mouse down events.
  298.  */
  299.     public boolean mouseDown (Event e, int x, int y) {
  300.     HandleMouse(x);
  301.     Motion();
  302.     return true;
  303.     }
  304.  
  305. /**
  306.  * An internal method used to handle mouse drag events.
  307.  */
  308.     public boolean mouseDrag (Event e, int x, int y) {
  309.     HandleMouse(x);
  310.     Motion();    
  311.     return true;
  312.     }
  313.  
  314. /**
  315.  * An internal method used to handle mouse up events.
  316.  */
  317.     public boolean mouseUp (Event e, int x, int y) {
  318.     HandleMouse(x);
  319.     Release();
  320.     return true;
  321.     }
  322.  
  323. /**
  324.  * An internal method used to handle resizing.
  325.  */
  326.     public synchronized void reshape(int x, int y, int width, int height) {
  327.     super.reshape(x, y, width, height);
  328.     pixelMin_ = THUMB_SIZE + BUFFER;
  329.     pixelMax_ = width - THUMB_SIZE - BUFFER - 1;
  330.     if (value_ != min_)
  331.         pixel_ = (int)(Math.round(Math.abs((double)(value_ - min_) /
  332.                            (double)(max_ - min_)) *
  333.                       (double)(pixelMax_ - pixelMin_)) +
  334.                pixelMin_);
  335.     else
  336.         pixel_ = pixelMin_;
  337.     }
  338.  
  339.     public Dimension preferredSize() {
  340.         Dimension sz = size();
  341.         if (reqx_ != -1)
  342.         sz.width = reqx_;
  343.     if (reqy_ != -1)
  344.         sz.height = reqy_;
  345.         return sz;
  346.     }
  347. }
  348.  
  349.